#ifndef HTTP_CONNECTION_H
#define HTTP_CONNECTION_H
#include "http_context.h"

#include <QTcpSocket>
#include <QPointer>

class HttpConnection : public QObject
{
    Q_OBJECT

public:
    // 获取OTT过程中的错误码
    enum OttErrorCode {
        JsonError = -1, //json 格式错误
        NoError = 0, // 无错误
        NoDomainAccount, // 当前无域账户登陆
        UserCancelAuth, //用户取消认证
        UserAuthInterrupt //用户授权中断
    };

    HttpConnection(qintptr sockFd, QObject *parent = nullptr);
    ~HttpConnection();

private:
    // 初始化信号槽连接
    void initConnect();
    // 获取本地IP端口
    QString localIpPort() const;
    // 获取对端IP端口
    QString peerIpPort() const;

    // 处理HTTP请求
    void processRequest();
    // 处理HTTP GET请求
    void processHttpGET();
    // 处理HTTP POST请求
    void processHttpPOST();
    // 构造一个index.html网页内容
    QString makeIndexHtml() const;

private Q_SLOTS:
    void onStateChanged(QAbstractSocket::SocketState);
    void onError(QAbstractSocket::SocketError);
    // 处理tcp socket的连接
    void onConnected();
    // 处理 tcp socket的断开
    void onDisconnected();
    // 处理数据的读取
    void onReadyRead();
    // 响应获取OTT的槽函数
    void onGetott(const QString &jsonStr);
    // 响应SsoService 返回信号的槽函数
    void onResponseCancel(qint64 requestIndex, int code);
    // 请求获取OTT的回调函数
    void getOttCallback(const QJsonObject &rootObject);

private:
    QPointer<QTcpSocket> m_tcpSocket; //tcp socket
    QByteArray m_buffer; //接收数据的buffer
    HttpContext m_httpContext; //处理HTTP报文的解析
};

#endif // HTTP_CONNECTION_H
